/**
摘要：温度传感器LM75AD的驱动
作者：Dr. GAO
时间：2023-3-18
联系方式：https://www.genbotter.com
*/

#include "i2c_lm75a.h"
#include "i2c_oled.h"
#include "stdio.h"

// 读温度传感器的温度寄存器的值并转换为温度值
float lm75a_get_temp(void){
	float temp_result;
	//读温度寄存器值
	uint8_t byte_data[2];
	lm75a_read_temp_reg(LM75A_I2C_ADDR, byte_data);
	
	//将温度寄存器值转为温度值
	uint16_t temp_reg = byte_data[0]<<3 | byte_data[1]>>5;
	
	if((temp_reg & 0x0400) == 0){
		temp_result = temp_reg * 0.125;
	}else{
		temp_reg = (~((temp_reg&0x03ff)-1)) & 0x03ff;    //补码到原码转换
		temp_result = temp_reg * (-0.125);
	}
	
	return temp_result;
}



/***
功能：读温度寄存器的值
输入：
	uint8_t lm75a_id： lm75a的iic从机地址
	uint8_t *p：读取结果存放的位置
返回：无
*****/
void lm75a_read_temp_reg(uint8_t lm75a_id, uint8_t *p){
	/******给LM75A写温度寄存器的指针字节********/   // 使用了I2C0（主模式）写功能，
	while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));    // 如果I2C0繁忙，空等
	i2c_start_on_bus(I2C0);                        // 在I2C0上生成一个起始位
	while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));   // 如果起始位还没有发送，空等
	i2c_master_addressing(I2C0, lm75a_id, I2C_TRANSMITTER); //发送地址，发送模式
	while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));  // 如果地址还没有发送，空等
	i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
	while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
	i2c_data_transmit(I2C0, LM75A_TEMP_REG);
	while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
	i2c_stop_on_bus(I2C0);
	while(I2C_CTL0(I2C0) & 0x20);
	
	/******读LM75A温度寄存器里面的两个字节的值********/  //使用了I2C0（主模式）读功能
	i2c_ackpos_config(I2C0, I2C_ACKPOS_NEXT);        //设置应答的位置
	
	while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));    // 如果I2C0繁忙，空等
	i2c_start_on_bus(I2C0);                        // 在I2C0上生成一个起始位
	while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));   // 如果起始位还没有发送，空等
	i2c_master_addressing(I2C0, lm75a_id, I2C_RECEIVER); //发送地址，接收模式
	i2c_ack_config(I2C0, I2C_ACK_DISABLE);
	while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
	i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
	
	//从I2C_DATA读值
	while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
	while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE));    // 如果I2C_DATA为空，空等
	*p = i2c_data_receive(I2C0);
	while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE));    // 如果I2C_DATA为空，空等
	*(p+1) = i2c_data_receive(I2C0);
	
	i2c_stop_on_bus(I2C0);
	while(I2C_CTL0(I2C0) & 0x20);
	
	i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);        //设置应答的位置
	i2c_ack_config(I2C0, I2C_ACK_ENABLE);
}

void lm75a_test(void)
{
	bsp_i2c_init();
	oled_init();
	oled_clear_all();
	oled_show_string(24, 0, (uint8_t *)"genbotter");
	float temp_result;
	char temp_string[80];

	while(1){
		temp_result = lm75a_get_temp();
		sprintf(temp_string, "temperature is: %.3f C.", temp_result);
		oled_show_string(0, 2, (uint8_t *)temp_string);
		delay_1ms(1000);  
	}
}